import numpy as np
import time
from IPython import display
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import random

Bao = [[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[0,9],[0,10],[0,11],[0,12],[0,13],[0,14],
       [1,0],[1,1],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7],[1,8],[1,9],[1,10],[1,11],[1,12],[1,13],[1,14],
       [2,0],[2,1],[2,2],[2,3],[2,4],[2,5],[2,6],[2,7],[2,8],[2,9],[2,10],[3,11],[3,12],[3,13],[3,14],
       [3,0],[3,1],[3,2],[3,3],[3,4],[3,5],[3,6],[3,7],[3,8],[3,9],[3,10],[3,11],[3,12],[3,13],[3,14],
       [4,0],[4,1],[4,2],[4,3],[4,4],[4,5],[4,6],[4,7],[4,8],[4,9],[4,10],[4,11],[4,12],[4,13],[4,14],
       [5,0],[5,1],[5,2],[5,3],[5,4],[5,5],[5,6],[5,7],[5,8],[5,9],[5,10],[5,11],[5,12],[5,13],[5,14],
       [6,0],[6,1],[6,2],[6,3],[6,4],[6,5],[6,6],[6,7],[6,8],[6,9],[6,10],[6,11],[6,12],[6,13],[6,14],
       [7,0],[7,1],[7,2],[7,3],[7,4],[7,5],[7,6],[7,7],[7,8],[7,9],[7,10],[7,11],[7,12],[7,13],[7,14],
       [8,0],[8,1],[8,2],[8,3],[8,4],[8,5],[8,6],[8,7],[8,8],[8,9],[8,10],[8,11],[8,12],[8,13],[8,14],
       [9,0],[9,1],[9,2],[9,3],[9,4],[9,5],[9,6],[9,7],[9,8],[9,9],[9,10],[9,11],[9,12],[9,13],[9,14],
       [10,0],[10,1],[10,2],[10,3],[10,4],[10,5],[10,6],[10,7],[10,8],[10,9],[10,10],[10,11],[10,12],[10,13],[10,14],
       [11,0],[11,1],[11,2],[11,3],[11,4],[11,5],[11,6],[11,7],[11,8],[11,9],[11,10],[11,11],[11,12],[11,13],[11,14],
       [12,0],[12,1],[12,2],[12,3],[12,4],[12,5],[12,6],[12,7],[12,8],[12,9],[12,10],[12,11],[12,12],[12,13],[12,14],
       [13,0],[13,1],[13,2],[13,3],[13,4],[13,5],[13,6],[13,7],[13,8],[13,9],[13,10],[13,11],[13,12],[13,13],[13,14],
       [14,0],[14,1],[14,2],[14,3],[14,4],[14,5],[14,6],[14,7],[14,8],[14,9],[14,10],[14,11],[14,12],[14,13],[14,14]]
# Some helper functions

# Initialize the board with starting positions
def init_board(pos_list, my_board):
    n = 0
    for pos in pos_list:
        n = n+1
        my_board[pos[0], pos[1]] = n
        #print(pos,pos[0])
    return my_board

def update_board(my_board):
    for i in range(1):
        increase_cells = 2
        for j in range(increase_cells): # 选取新一轮的细胞数
            bao = random.choice(Bao)
            if bao[0] == 14 and bao[1] == 14: # 上 左 下 右
                if my_board[bao[0]-1,bao[1]] == 1 or my_board[bao[0],bao[1]-1] == 1 or my_board[0,14] == 1 or \
                        my_board[14,0] == 1:
                    my_board[bao[0], bao[1]] = 1
                    Bao.remove(bao)
                    #pos_list.append(bao)
                    continue
                elif my_board[bao[0]-1,bao[1]] == 2 or my_board[bao[0],bao[1]-1] == 2 or my_board[0,14] == 2 or \
                        my_board[14,0] == 2:
                    my_board[bao[0], bao[1]] = 2
                    Bao.remove(bao)
                    #pos_list.append(bao)
                    continue

            elif bao[0] == 14 and 0 <= bao[1] <= 13 :
                if my_board[bao[0] - 1, bao[1]] == 1 or my_board[bao[0], bao[1] - 1] == 1 or my_board[0, bao[1]] == 1 or \
                        my_board[14, bao[1]+1] == 1:
                    my_board[bao[0], bao[1]] = 1
                    Bao.remove(bao)
                    #pos_list.append(bao)
                    continue
                elif my_board[bao[0] - 1, bao[1]] == 2 or my_board[bao[0], bao[1] - 1] == 2 or my_board[0, bao[1]] == 2 or \
                        my_board[14, bao[1]+1] == 2:
                    my_board[bao[0], bao[1]] = 2
                    Bao.remove(bao)
                    #pos_list.append(bao)
                    continue


            elif 0 <= bao[0] <= 13 and bao[1] == 14 :
                if my_board[bao[0] - 1, bao[1]] == 1 or my_board[bao[0], bao[1] - 1] == 1 or my_board[bao[0]+1, bao[1]] == 1 or \
                        my_board[bao[0], 0] == 1:
                    my_board[bao[0], bao[1]] = 1
                    Bao.remove(bao)
                    #pos_list.append(bao)
                    continue
                if my_board[bao[0] - 1, bao[1]] == 2 or my_board[bao[0], bao[1] - 1] == 2 or my_board[bao[0] + 1, bao[1]] == 2 or \
                        my_board[bao[0], 0] == 2:
                    my_board[bao[0], bao[1]] = 2
                    Bao.remove(bao)
                    #pos_list.append(bao)
                    continue

            else:
                if my_board[bao[0]-1, bao[1]] == 1 or my_board[bao[0], bao[1]-1] == 1 or my_board[bao[0]+1, bao[1]] == 1 or \
                        my_board[bao[0], bao[1]+1] == 1:
                    my_board[bao[0], bao[1]] = 1
                    Bao.remove(bao)
                    #pos_list.append(bao)
                    continue

                elif my_board[bao[0]-1, bao[1]] == 2 or my_board[bao[0], bao[1]-1] == 2 or my_board[bao[0]+1, bao[1]] == 2 or \
                        my_board[bao[0], bao[1]+1] == 2:
                    my_board[bao[0], bao[1]] = 2
                    Bao.remove(bao)
                    #pos_list.append(bao)
                    continue

        return my_board


# Input variables for the board
boardsize = 15 # board will be X by X where X = boardsize
initial_cells = 2 # this number of initial cells will be placed in randomly generated positions

my_board = np.zeros((boardsize , boardsize ))
pos_list = []
for i in range(initial_cells):
    bao = random.choice(Bao)
    Bao.remove(bao)
    pos_list.append(bao)



my_board = init_board(pos_list, my_board)
#my_board[5][3] =5
#my_board[5][4] = 7
##### Animate the board #####
# This will throw an error the first time you run the code, but the program will run properly if you
# execute the cell again (there is an error with the animation package that I cannot seem to get rid of)

def animate(frame):
    im.set_array(update_board(my_board))
    return im,


# matplotlib notebook
fig = plt.gcf() #创建画布
im = plt.imshow(my_board, animated=True)


anim = animation.FuncAnimation(fig, animate, frames=200, interval=500000, blit=False)
plt.show()



#print(pos_list)
#print(my_board)
#print(pos_list[0][0],pos_list[0][1],pos_list[1][1])


